package com.ruoyi.fun.service.impl;

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.ruoyi.fun.mapper.HiolabsRegionMapper;
import com.ruoyi.fun.domain.HiolabsRegion;
import com.ruoyi.fun.service.IHiolabsRegionService;

/**
 * 地区Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-01-16
 */
@Service
public class HiolabsRegionServiceImpl implements IHiolabsRegionService 
{
    @Autowired
    private HiolabsRegionMapper hiolabsRegionMapper;
    
    @Autowired(required = false)
    private RedisTemplate<String, Object> redisTemplate;
    
    // Redis缓存键前缀
    private static final String CACHE_PREFIX = "region:";
    // 缓存过期时间（24小时）
    private static final long CACHE_EXPIRE_TIME = 24 * 60 * 60;

    /**
     * 查询地区
     * 
     * @param id 地区主键
     * @return 地区
     */
    @Override
    public HiolabsRegion selectHiolabsRegionById(Long id)
    {
        return hiolabsRegionMapper.selectHiolabsRegionById(id);
    }

    /**
     * 查询地区列表
     * 
     * @param hiolabsRegion 地区
     * @return 地区
     */
    @Override
    public List<HiolabsRegion> selectHiolabsRegionList(HiolabsRegion hiolabsRegion)
    {
        return hiolabsRegionMapper.selectHiolabsRegionList(hiolabsRegion);
    }

    /**
     * 根据类型查询地区列表
     * 
     * @param type 地区类型(1:省份 2:城市 3:区县)
     * @return 地区集合
     */
    @Override
    @SuppressWarnings("unchecked")
    public List<HiolabsRegion> selectHiolabsRegionListByType(Integer type)
    {
        String cacheKey = CACHE_PREFIX + "type:" + type;
        
        // 先从Redis缓存中查询（如果Redis可用）
        if (redisTemplate != null) {
            List<HiolabsRegion> cachedResult = (List<HiolabsRegion>) redisTemplate.opsForValue().get(cacheKey);
            if (cachedResult != null) {
                return cachedResult;
            }
        }
        
        // 缓存中没有数据或Redis不可用，从数据库查询
        List<HiolabsRegion> result = hiolabsRegionMapper.selectHiolabsRegionListByType(type);
        
        // 将查询结果存入Redis缓存（如果Redis可用）
        if (redisTemplate != null && result != null && !result.isEmpty()) {
            redisTemplate.opsForValue().set(cacheKey, result, CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
        }
        
        return result;
    }

    /**
     * 根据父级ID查询地区列表
     * 
     * @param parentId 父级地区ID
     * @return 地区集合
     */
    @Override
    @SuppressWarnings("unchecked")
    public List<HiolabsRegion> selectHiolabsRegionListByParentId(Long parentId)
    {
        String cacheKey = CACHE_PREFIX + "parent:" + parentId;
        
        // 先从Redis缓存中查询（如果Redis可用）
        if (redisTemplate != null) {
            List<HiolabsRegion> cachedResult = (List<HiolabsRegion>) redisTemplate.opsForValue().get(cacheKey);
            if (cachedResult != null) {
                return cachedResult;
            }
        }
        
        // 缓存中没有数据或Redis不可用，从数据库查询
        List<HiolabsRegion> result = hiolabsRegionMapper.selectHiolabsRegionListByParentId(parentId);
        
        // 将查询结果存入Redis缓存（如果Redis可用）
        if (redisTemplate != null && result != null && !result.isEmpty()) {
            redisTemplate.opsForValue().set(cacheKey, result, CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
        }
        
        return result;
    }

    /**
     * 根据类型和父级ID查询地区列表
     * 
     * @param type 地区类型
     * @param parentId 父级地区ID
     * @return 地区集合
     */
    @Override
    @SuppressWarnings("unchecked")
    public List<HiolabsRegion> selectHiolabsRegionListByTypeAndParentId(Integer type, Long parentId)
    {
        String cacheKey = CACHE_PREFIX + "type:" + type + ":parent:" + parentId;
        
        // 先从Redis缓存中查询（如果Redis可用）
        if (redisTemplate != null) {
            List<HiolabsRegion> cachedResult = (List<HiolabsRegion>) redisTemplate.opsForValue().get(cacheKey);
            if (cachedResult != null) {
                return cachedResult;
            }
        }
        
        // 缓存中没有数据或Redis不可用，从数据库查询
        List<HiolabsRegion> result = hiolabsRegionMapper.selectHiolabsRegionListByTypeAndParentId(type, parentId);
        
        // 将查询结果存入Redis缓存（如果Redis可用）
        if (redisTemplate != null && result != null && !result.isEmpty()) {
            redisTemplate.opsForValue().set(cacheKey, result, CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
        }
        
        return result;
    }

    /**
     * 新增地区
     * 
     * @param hiolabsRegion 地区
     * @return 结果
     */
    @Override
    public int insertHiolabsRegion(HiolabsRegion hiolabsRegion)
    {
        int result = hiolabsRegionMapper.insertHiolabsRegion(hiolabsRegion);
        
        // 清除相关缓存
        if (result > 0) {
            clearRegionCache();
        }
        
        return result;
    }

    /**
     * 修改地区
     * 
     * @param hiolabsRegion 地区
     * @return 结果
     */
    @Override
    public int updateHiolabsRegion(HiolabsRegion hiolabsRegion)
    {
        int result = hiolabsRegionMapper.updateHiolabsRegion(hiolabsRegion);
        
        // 清除相关缓存
        if (result > 0) {
            clearRegionCache();
        }
        
        return result;
    }

    /**
     * 批量删除地区
     * 
     * @param ids 需要删除的地区主键
     * @return 结果
     */
    @Override
    public int deleteHiolabsRegionByIds(Long[] ids)
    {
        int result = hiolabsRegionMapper.deleteHiolabsRegionByIds(ids);
        
        // 清除相关缓存
        if (result > 0) {
            clearRegionCache();
        }
        
        return result;
    }

    /**
     * 删除地区信息
     * 
     * @param id 地区主键
     * @return 结果
     */
    @Override
    public int deleteHiolabsRegionById(Long id)
    {
        int result = hiolabsRegionMapper.deleteHiolabsRegionById(id);
        
        // 清除相关缓存
        if (result > 0) {
            clearRegionCache();
        }
        
        return result;
    }
    
    /**
     * 清除地区相关的Redis缓存
     */
    private void clearRegionCache()
    {
        try {
            // 清除所有以region:开头的缓存键（如果Redis可用）
            if (redisTemplate != null) {
                redisTemplate.delete(redisTemplate.keys(CACHE_PREFIX + "*"));
            }
        } catch (Exception e) {
            // 缓存清除失败不影响业务逻辑，记录日志即可
            System.err.println("清除地区缓存失败: " + e.getMessage());
        }
    }
}